﻿#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp> 
#include <opencv2/imgproc.hpp>

/*
 * @brief 通道交换
**/
cv::Mat __stdcall ChannelSwap(const cv::Mat& img);

int main(int argc, char const* argv[])
{
    auto img = cv::imread("./../../images/imori.jpg", cv::IMREAD_COLOR);
    auto out = ChannelSwap(img);
    cv::namedWindow("sample", cv::WINDOW_AUTOSIZE);
    // cv::imwrite("out.jpg", out);
    cv::imshow("sample", out);

    cv::Mat RGBImage;
    cv::cvtColor(img, RGBImage, cv::COLOR_BGR2RGB);     //将图像转换为BGR
    cv::namedWindow("RGBImage", cv::WINDOW_AUTOSIZE);
    cv::imshow("RGBImage", RGBImage);

    cv::Mat grayImage;
    cv::cvtColor(img, grayImage, cv::COLOR_BGR2GRAY);     //将图像转换为灰度图片
    cv::namedWindow("grayImage", cv::WINDOW_AUTOSIZE);
    cv::imshow("grayImage", grayImage);
    
    cv::waitKey(0);
    cv::destroyAllWindows();
    cv::waitKey(0);
    return 0;
}

cv::Mat ChannelSwap(const cv::Mat& img)
{
    auto width = img.cols;
    auto height = img.rows;

    cv::Mat out = cv::Mat::zeros(height, width, CV_8UC3);  //创建一个8位3通道的图片
 
    for (int y = 0; y < height; y++)  
    {
        for (int x = 0; x < width; x++) 
        {
            // B -> R
            out.at<cv::Vec3b>(y, x)[2] = img.at<cv::Vec3b>(y, x)[0];
            // G -> G
            out.at<cv::Vec3b>(y, x)[1] = img.at<cv::Vec3b>(y, x)[1];
            // R -> B
            out.at<cv::Vec3b>(y, x)[0] = img.at<cv::Vec3b>(y, x)[2];
        }
    }

    return out;
}
